Рейтинговые книги
Читем онлайн Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 49 50 51 52 53 54 55 56 57 ... 59
class="empty-line"/>

Запуск объекта Service осуществляется с помощью метода start,

перезапуск объекта Service – с помощью метода restart,

а сброс объекта Service – с помощью метода reset.

Прерывание выполнения фоновой задачи обеспечивает метод cancel класса Service.

Получить результат выполнения фоновой задачи можно с помощью метода getValue класса Service.

В качестве примера выполнения фоновой задачи в JavaFX-приложении здесь приведен код, в котором индикатор ProgressBar отображает ход вычислений, производимых в фоновом потоке.

Здесь мы создаем индикатор и кнопку.

В обработчике нажатия кнопки мы создаем фоновую задачу, в методе call которой мы вызываем метод updateProgress, передавая прогресс выполнения задачи.

В методе updateProgress мы обновляем индикатор.

Дальше мы запускаем задачу с помощью объекта Service.

И создаем вторую кнопку для сброса индикатора.

Если возникает потребность обновлять JavaFX компоненты в методе call задачи Task, можно использовать метод Platform.runLater с объектом Runnable, в методе run которого обращаться к JavaFX компонентам.

Класс ScheduledService расширяет класс Service, обеспечивая автоматический перезапуск фоновой задачи после успешного выполнения, и при некоторых условиях перезапуск даже в случае сбоя.

При создании объект ScheduledService находится в состоянии READY.

После вызова метода start или restart объект ScheduledService переходит в состояние SCHEDULED на время, указанное свойством delay.

В состоянии RUNNING объект ScheduledService выполняет свою задачу.

По завершении задачи объект ScheduledService переходит в состояние SUCCEEDED, затем в состояние READY, а затем возвращается в состояние SCHEDULED.

Продолжительность пребывания в состоянии SCHEDULED зависит от времени последнего перехода в состояние RUNNING, текущего времени и значения свойства period, которое определяет минимальное время между двумя последовательными прогонами.

Если предыдущее выполнение завершено до истечения значения свойства period, то объект ScheduledService остается в состоянии SCHEDULED до истечения значения свойства period.

В противном случае, если предыдущее выполнение заняло больше времени, чем указанное значения свойства period, объект ScheduledService мгновенно переходит в состояние RUNNING.

В случае, когда задача завершается в состоянии FAILED, объект ScheduledService перезапускается или завершается, в зависимости от значений свойств restartOnFailure, backoffStrategy и maximumFailureCount.

Если свойство restartOnFailure имеет значение false, объект ScheduledService переходит в состояние FAILED и завершает работу.

В этом случае вы можете перезапустить поврежденный объект ScheduledService вручную.

Если свойство restartOnFailure имеет значение true, объект ScheduledService переходит в состояние SCHEDULED и остается в этом состоянии на протяжении всего свойства cumulativePeriod, которое получается в результате вызова свойства backoffStrategy.

Используя свойство cumulativePeriod, вы можете заставить поврежденный объект ScheduledService ждать до следующего прогона.

После успешного завершения ScheduledService свойство cumulativePeriod сбрасывается до значения свойства period.

Когда количество последовательных сбоев достигает значения свойства maximumFailureCount, объект ScheduledService переходит в состояние FAILED и завершает работу.

Любые изменения, которые происходят с свойствами delay и period при запуске объекта ScheduledService, будут учтены на следующей итерации.

Значения по умолчанию для свойств delay и period установлены в 0.

Совместное использование Swing и JavaFX, SWT и JavaFX

Пакет embed. swing платформы JavaFX обеспечивает встраивание JavaFX-сцены в Swing-приложение.

Для этого пакет javafx. embed. swing предоставляет компонент JFXPanel.

Класс JFXPanel расширяет класс swing. JComponent, являющийся базовым классом для всех Swing-компонентов, помещаемых в Swing-контейнеры верхнего уровня JFrame и JDialog.

Класс JFXPanel имеет, помимо унаследованных от класса JComponent, публичные методы, в том числе метод setScene, устанавливающий JavaFX сцену.

При использовании компонента JFXPanel в Swing-приложении необходимо учитывать, что Swing-компоненты обрабатываются в потоке Event Dispatch Thread, а JavaFX-компоненты – в потоке JavaFX Application Thread.

Поэтому для инициализации и изменения графа JavaFX-сцены в Swing-приложении используется метод Platform.runLater.

А для инициализации и изменения Swing-интерфейса используется метод SwingUtilities.invokeLater.

Обратную операцию – встраивание Swing компонентов в JavaFX приложение позволяет класс SwingNode пакета embed. swing.

Здесь мы создаем некий Swing контент, который устанавливаем в узел SwingNode методом setContent.

Делаем мы это в Swing потоке Event Dispatch Thread.

И затем используем этот узел уже в потоке JavaFX Application Thread.

Аналогично пакету embed. swing, пакет embed. swt платформы JavaFX обеспечивает встраивание JavaFX-сцены в SWT-приложение.

Для этого пакет embed. swt предоставляет компонент FXCanvas.

Класс FXCanvas расширяет класс Canvas пакета swt. widgets графической библиотеки SWT, обеспечивающий рисование произвольной графики.

Класс FXCanvas имеет, помимо унаследованных от класса Canvas, публичные методы, в том числе метод setScene, устанавливающий JavaFX сцену.

JavaFX-сцена вставляется в FXCanvas-компонент, а FXCanvas-компонент вставляется в SWT-окно Shell с помощью приведенного здесь шаблона кода.

О библиотеке SWT мы поговорим позже.

Язык FXML

Платформа JavaFX представляет альтернативный Java-коду способ создания графа сцены JavaFX-приложения с помощью языка FXML, являющегося декларативным языком, основанным на языке XML.

Применение языка FXML находится в русле традиций использования декларативных языков для описания графических интерфейсов пользователя.

Использование языка FXML заключается в создании FXML-файла, содержащего описание дочерних узлов корневого узла графа сцены, и загрузки его с помощью статического метода load класса FXMLLoader, возвращающего корневой узел графа сцены.

Преимущество такой модели создания графического интерфейса заключается в том, что изменение графа сцены JavaFX-приложения не требует перекомпиляции Java-кода – FXML-описание интерфейса загружается при запуске JavaFX-приложения.

FXML-файл содержит описание корневой JavaFX-панели AnchorPane с дочерними JavaFX-компонентами Button и Label.

Атрибут onAction компонента Button ссылается на метод handleButtonAction, обрабатывающий нажатие кнопки Button, класса Controller, который определен в качестве контроллера атрибутом fx: controller компонента AnchorPane.

Язык FXML поддерживает шаблон проектирования Model-View-Controller (MVC), разделяющий бизнес-логику, представление данных и взаимодействие с пользователем.

В MVC-терминологии FXML-описание является представлением View, модель Model представляет компонент JavaFX Beans, обеспечивающий данные JavaFX-приложения, а контроллером Controller является Java-класс, реализующий код взаимодействия с пользователем и связывания компонента JavaFX Beans с FXML-описанием графического интерфейса JavaFX-приложения.

Для включения такого контроллера в JavaFX-приложение, его необходимо указать в качестве значения атрибута fx: controller FXML-описания.

FXML-контроллер может реализовывать интерфейс Initializable, имеющий единственный метод initialize, вызываемый средой выполнения для инициализации класса FXML-контроллера и используемый, например, для связывания компонента данных JavaFX Beans с FXML-описанием.

Методу initialize, в качестве аргументов, среда выполнения передает URL-адрес FXML-описания графического интерфейса JavaFX-приложения и ResourceBundle-ресурсы JavaFX-приложения.

URL-адрес FXML-описания и ResourceBundle-ресурсы определяются при вызове в главном классе JavaFX-приложения статического метода load класса FXMLLoader.

Файл ResourceBundle-ресурсов решает задачу локализации строк графического интерфейса и передается как ResourceBundle-объект методу load с помощью статического метода getBundle класса java.util.ResourceBundle.

В пакете приложения можно создать файл с расширением. properties, имя которого без расширения, но предваряя именем пакета, нужно указать в аргументе метода ResourceBundle.getBundle.

Заполнив файл ResourceBundle-ресурсов парами ключ-значение, получить доступ к любому значению можно с помощью метода getString класса ResourceBundle в Java-коде, указав в качестве аргумента ключ, или используя префикс «%» и имя ключа в качестве значения атрибута компонента FXML-описания.

Помимо интерфейса Initializable, FXML-контроллер может использовать аннотацию @FXML пакета javafx. fxml, которая маркирует protected или private поля и методы FXML-контроллера, доступные из FXML-описания.

Чтобы не применять аннотацию @FXML, поля и методы

1 ... 49 50 51 52 53 54 55 56 57 ... 59
На этой странице вы можете бесплатно читать книгу Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин бесплатно.

Оставить комментарий